# 20 "lexer.mll"
 
open Lexing
open Ast

type error_msg =
	| Invalid_character of char
	| Unterminated_string
	| Unterminated_regexp
	| Unclosed_comment
	| Invalid_escape
	| Invalid_option

exception Error of error_msg * pos

let error_msg = function
	| Invalid_character c when int_of_char c > 32 && int_of_char c < 128 -> Printf.sprintf "Invalid character '%c'" c
	| Invalid_character c -> Printf.sprintf "Invalid character 0x%.2X" (int_of_char c)
	| Unterminated_string -> "Unterminated string"
	| Unterminated_regexp -> "Unterminated regular expression"
	| Unclosed_comment -> "Unclosed comment"
	| Invalid_escape -> "Invalid escape sequence"
	| Invalid_option -> "Invalid regular expression option"

type lexer_file = {
	lfile : string;
	mutable lline : int;
	mutable lmaxline : int;
	mutable llines : (int * int) list;
	mutable lrlines : (int * int) list;
}

let make_file file =
	{
		lfile = file;
		lline = 1;
		lmaxline = 1;
		llines = [];
		lrlines = [];		
	}


let cur = ref (make_file "")

let all_files = Hashtbl.create 0

let buf = Buffer.create 100

let error e pos =
	raise (Error (e,{ pmin = pos; pmax = pos; pfile = !cur.lfile }))

let keywords =
	let h = Hashtbl.create 3 in
	List.iter (fun k -> Hashtbl.add h (s_keyword k) k)
		[Function;Class;Static;Var;If;Else;While;Do;For;
		Break;Return;Continue;Extends;Implements;Import;
		Switch;Case;Default;Public;Private;Try;Untyped;
		Catch;New;This;Throw;Extern;Enum;In;Interface;
		Cast;Override;Dynamic;Typedef;Package;Callback;
		Inline;Using;Null;True;False];
	h

let init file =
	let f = make_file file in
	cur := f;
	Hashtbl.replace all_files file f

let save() =
	!cur

let restore c =	
	cur := c

let newline lexbuf =
	let cur = !cur in
	cur.llines <- (lexeme_end lexbuf,cur.lline) :: cur.llines;	
	cur.lline <- cur.lline + 1

let find_line p f =
	let rec loop delta = function
		| [] -> f.lmaxline, p - delta
		| (lp,line) :: l when lp > p -> line, p - delta
		| (lp,_) :: l -> loop lp l
	in
	if f.lmaxline <> f.lline then begin
		f.lmaxline <- f.lline;
		f.lrlines <- List.rev f.llines;
	end;
	loop 0 f.lrlines

let find_pos p =
	let file = (try Hashtbl.find all_files p.pfile with Not_found -> make_file p.pfile) in
	find_line p.pmin file

let get_error_line p =
	let l, _ = find_pos p in
	l

let get_error_pos printer p =
	if p.pmin = -1 then
		"(unknown)"
	else
		let file = (try Hashtbl.find all_files p.pfile with Not_found -> make_file p.pfile) in
		let l1, p1 = find_line p.pmin file in
		let l2, p2 = find_line p.pmax file in
		if l1 = l2 then begin
			let s = (if p1 = p2 then Printf.sprintf " %d" p1 else Printf.sprintf "s %d-%d" p1 p2) in
			Printf.sprintf "%s character%s" (printer p.pfile l1) s
		end else
			Printf.sprintf "%s lines %d-%d" (printer p.pfile l1) l1 l2

let reset() = Buffer.reset buf
let contents() = Buffer.contents buf
let store lexbuf = Buffer.add_string buf (lexeme lexbuf)
let add c = Buffer.add_string buf c

let mk_tok t pmin pmax =
	t , { pfile = !cur.lfile; pmin = pmin; pmax = pmax }

let mk lexbuf t =
	mk_tok t (lexeme_start lexbuf) (lexeme_end lexbuf)

let mk_ident lexbuf =
	let s = lexeme lexbuf in
	mk lexbuf (try Kwd (Hashtbl.find keywords s) with Not_found -> Const (Ident s))

let invalid_char lexbuf =
	error (Invalid_character (lexeme_char lexbuf 0)) (lexeme_start lexbuf)


# 132 "lexer.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base = 
   "\000\000\253\255\000\000\000\000\000\000\255\255\001\000\006\000\
    \191\255\095\000\198\000\017\001\092\001\120\001\197\255\198\255\
    \200\255\201\255\202\255\203\255\204\255\205\255\206\255\207\255\
    \218\255\219\255\220\255\221\255\037\000\041\000\073\000\074\000\
    \075\000\094\000\181\000\076\000\091\000\095\000\098\000\179\000\
    \179\000\197\001\219\001\252\255\000\000\000\000\251\001\017\002\
    \039\002\077\002\093\000\105\002\115\002\207\001\229\001\245\255\
    \005\002\137\002\096\000\147\002\224\255\199\255\233\255\098\001\
    \236\255\243\255\225\255\235\255\242\255\196\255\240\255\228\255\
    \239\255\227\255\238\255\237\255\234\255\229\255\092\000\232\255\
    \231\255\230\255\157\002\232\002\051\003\126\003\068\002\069\002\
    \107\000\002\000\254\255\239\003\240\003\250\255\152\000\003\000\
    \241\003\245\003\149\000\007\000\251\255\175\003\246\003\246\255\
    \000\004\247\255\079\004\249\255\102\004\160\004\215\004\248\255\
    \193\002";
  Lexing.lex_backtrk = 
   "\002\000\255\255\255\255\255\255\255\255\255\255\001\000\255\255\
    \255\255\063\000\062\000\062\000\061\000\064\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\032\000\047\000\033\000\044\000\
    \042\000\041\000\040\000\039\000\014\000\046\000\043\000\045\000\
    \038\000\005\000\005\000\255\255\003\000\001\000\255\255\255\255\
    \255\255\004\000\255\255\255\255\006\000\009\000\255\255\255\255\
    \008\000\255\255\255\255\007\000\255\255\255\255\255\255\011\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\029\000\255\255\
    \255\255\255\255\060\000\060\000\060\000\062\000\255\255\004\000\
    \003\000\001\000\255\255\255\255\006\000\255\255\004\000\001\000\
    \255\255\006\000\002\000\001\000\255\255\255\255\010\000\255\255\
    \255\255\255\255\008\000\255\255\255\255\255\255\255\255\255\255\
    \002\000";
  Lexing.lex_default = 
   "\255\255\000\000\255\255\255\255\255\255\000\000\006\000\008\000\
    \000\000\255\255\255\255\255\255\255\255\255\255\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\000\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\
    \255\255\255\255\255\255\255\255\000\000\000\000\000\000\063\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\
    \000\000\000\000\255\255\255\255\255\255\255\255\087\000\087\000\
    \255\255\255\255\000\000\092\000\092\000\000\000\255\255\255\255\
    \097\000\097\000\255\255\255\255\000\000\102\000\102\000\000\000\
    \105\000\000\000\255\255\000\000\255\255\255\255\255\255\000\000\
    \255\255";
  Lexing.lex_trans = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\045\000\001\000\255\255\090\000\090\000\255\255\045\000\
    \043\000\090\000\000\000\044\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \045\000\006\000\000\000\002\000\000\000\000\000\045\000\028\000\
    \015\000\013\000\012\000\035\000\034\000\014\000\019\000\018\000\
    \031\000\038\000\024\000\037\000\040\000\039\000\042\000\041\000\
    \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\
    \025\000\026\000\030\000\029\000\027\000\017\000\016\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\023\000\081\000\022\000\032\000\011\000\080\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\021\000\033\000\020\000\036\000\078\000\077\000\076\000\
    \075\000\070\000\069\000\055\000\068\000\065\000\060\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\079\000\001\000\074\000\067\000\066\000\000\000\064\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\001\000\004\000\100\000\000\000\009\000\005\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\073\000\071\000\000\000\061\000\000\000\000\000\
    \000\000\058\000\063\000\059\000\059\000\059\000\059\000\059\000\
    \059\000\059\000\059\000\059\000\059\000\000\000\000\000\003\000\
    \062\000\043\000\072\000\000\000\043\000\000\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \001\000\255\255\000\000\000\000\000\000\000\000\005\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\000\000\000\000\000\000\000\000\010\000\000\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\255\255\000\000\000\000\255\255\
    \011\000\000\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\000\000\
    \000\000\000\000\000\000\012\000\000\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\083\000\
    \000\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\047\000\000\000\041\000\041\000\041\000\
    \041\000\041\000\041\000\041\000\041\000\041\000\041\000\053\000\
    \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
    \053\000\047\000\046\000\041\000\041\000\041\000\041\000\041\000\
    \041\000\041\000\041\000\041\000\041\000\053\000\053\000\053\000\
    \053\000\053\000\053\000\053\000\053\000\053\000\053\000\000\000\
    \046\000\000\000\000\000\000\000\000\000\000\000\057\000\000\000\
    \057\000\000\000\046\000\056\000\056\000\056\000\056\000\056\000\
    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\050\000\
    \046\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
    \052\000\052\000\052\000\000\000\000\000\000\000\090\000\255\255\
    \000\000\089\000\255\255\048\000\000\000\000\000\051\000\049\000\
    \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\
    \049\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\
    \049\000\049\000\049\000\049\000\049\000\049\000\088\000\255\255\
    \000\000\000\000\000\000\000\000\000\000\000\000\051\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\049\000\049\000\049\000\
    \049\000\049\000\049\000\049\000\049\000\049\000\049\000\000\000\
    \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\
    \049\000\049\000\049\000\049\000\054\000\000\000\054\000\000\000\
    \000\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
    \053\000\053\000\053\000\052\000\052\000\052\000\052\000\052\000\
    \052\000\052\000\052\000\052\000\052\000\000\000\049\000\049\000\
    \049\000\049\000\049\000\049\000\000\000\000\000\000\000\000\000\
    \051\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
    \056\000\056\000\056\000\059\000\059\000\059\000\059\000\059\000\
    \059\000\059\000\059\000\059\000\059\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\000\000\
    \051\000\000\000\000\000\000\000\000\000\000\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \000\000\000\000\000\000\000\000\082\000\000\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\090\000\090\000\090\000\090\000\090\000\090\000\
    \005\000\090\000\005\000\090\000\090\000\090\000\005\000\090\000\
    \090\000\090\000\090\000\090\000\005\000\090\000\005\000\090\000\
    \090\000\090\000\090\000\090\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\005\000\255\255\000\000\083\000\
    \000\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\000\000\000\000\
    \000\000\000\000\084\000\000\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \000\000\005\000\000\000\000\000\005\000\000\000\000\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\000\000\000\000\000\000\000\000\085\000\103\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\090\000\255\255\090\000\095\000\255\255\099\000\255\255\
    \255\255\000\000\255\255\255\255\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\104\000\000\000\000\000\000\000\000\000\
    \000\000\093\000\255\255\000\000\000\000\000\000\000\000\000\000\
    \093\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\093\000\255\255\000\000\000\000\
    \093\000\093\000\093\000\093\000\000\000\093\000\093\000\090\000\
    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
    \093\000\093\000\000\000\000\000\000\000\000\000\000\000\093\000\
    \000\000\000\000\107\000\000\000\107\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\094\000\255\255\098\000\000\000\000\000\
    \000\000\255\255\255\255\107\000\000\000\106\000\000\000\107\000\
    \000\000\000\000\000\000\093\000\093\000\093\000\093\000\000\000\
    \000\000\000\000\107\000\000\000\107\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\043\000\000\000\
    \000\000\000\000\001\000\107\000\100\000\106\000\000\000\107\000\
    \107\000\000\000\000\000\093\000\093\000\093\000\000\000\108\000\
    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
    \108\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \108\000\108\000\108\000\108\000\108\000\108\000\109\000\109\000\
    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\109\000\
    \109\000\109\000\109\000\109\000\109\000\000\000\000\000\005\000\
    \108\000\108\000\108\000\108\000\108\000\108\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\109\000\
    \109\000\109\000\109\000\109\000\109\000\000\000\000\000\000\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
    \110\000\110\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\110\000\110\000\110\000\110\000\110\000\110\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\
    \255\255\005\000\000\000\000\000\000\000\255\255\255\255\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \255\255\110\000\110\000\110\000\110\000\110\000\110\000\111\000\
    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
    \111\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \111\000\111\000\111\000\111\000\111\000\111\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \111\000\111\000\111\000\111\000\111\000\111\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
    ";
  Lexing.lex_check = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\045\000\044\000\006\000\089\000\095\000\006\000\007\000\
    \007\000\099\000\255\255\007\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \045\000\002\000\255\255\000\000\255\255\255\255\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\028\000\007\000\007\000\007\000\029\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
    \007\000\007\000\007\000\007\000\007\000\030\000\030\000\031\000\
    \032\000\035\000\036\000\050\000\037\000\038\000\058\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\078\000\088\000\033\000\037\000\037\000\255\255\038\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\094\000\003\000\098\000\255\255\009\000\004\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
    \009\000\009\000\033\000\034\000\255\255\039\000\255\255\255\255\
    \255\255\040\000\039\000\040\000\040\000\040\000\040\000\040\000\
    \040\000\040\000\040\000\040\000\040\000\255\255\255\255\000\000\
    \039\000\098\000\034\000\255\255\094\000\255\255\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \000\000\006\000\255\255\255\255\255\255\255\255\007\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\255\255\255\255\255\255\255\255\010\000\255\255\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\
    \010\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\063\000\255\255\255\255\063\000\
    \011\000\255\255\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\
    \011\000\011\000\011\000\011\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\255\255\
    \255\255\255\255\255\255\012\000\255\255\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\
    \012\000\012\000\012\000\012\000\012\000\012\000\012\000\013\000\
    \255\255\013\000\013\000\013\000\013\000\013\000\013\000\013\000\
    \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\
    \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\
    \013\000\013\000\013\000\041\000\255\255\041\000\041\000\041\000\
    \041\000\041\000\041\000\041\000\041\000\041\000\041\000\053\000\
    \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
    \053\000\042\000\041\000\042\000\042\000\042\000\042\000\042\000\
    \042\000\042\000\042\000\042\000\042\000\054\000\054\000\054\000\
    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\255\255\
    \042\000\255\255\255\255\255\255\255\255\255\255\046\000\255\255\
    \046\000\255\255\041\000\046\000\046\000\046\000\046\000\046\000\
    \046\000\046\000\046\000\046\000\046\000\056\000\056\000\056\000\
    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\047\000\
    \042\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\
    \047\000\047\000\047\000\255\255\255\255\255\255\086\000\087\000\
    \255\255\086\000\087\000\042\000\255\255\255\255\047\000\048\000\
    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
    \048\000\255\255\063\000\255\255\255\255\255\255\255\255\255\255\
    \048\000\048\000\048\000\048\000\048\000\048\000\086\000\087\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\047\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\049\000\049\000\049\000\
    \049\000\049\000\049\000\049\000\049\000\049\000\049\000\255\255\
    \048\000\048\000\048\000\048\000\048\000\048\000\049\000\049\000\
    \049\000\049\000\049\000\049\000\051\000\255\255\051\000\255\255\
    \255\255\051\000\051\000\051\000\051\000\051\000\051\000\051\000\
    \051\000\051\000\051\000\052\000\052\000\052\000\052\000\052\000\
    \052\000\052\000\052\000\052\000\052\000\255\255\049\000\049\000\
    \049\000\049\000\049\000\049\000\255\255\255\255\255\255\255\255\
    \052\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
    \057\000\057\000\057\000\059\000\059\000\059\000\059\000\059\000\
    \059\000\059\000\059\000\059\000\059\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\255\255\
    \052\000\255\255\255\255\255\255\255\255\255\255\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \255\255\255\255\255\255\255\255\082\000\255\255\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\112\000\112\000\112\000\112\000\112\000\112\000\
    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
    \112\000\112\000\112\000\112\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\086\000\087\000\255\255\083\000\
    \255\255\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
    \083\000\083\000\083\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\255\255\255\255\
    \255\255\255\255\084\000\255\255\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
    \084\000\084\000\084\000\084\000\084\000\084\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \255\255\101\000\255\255\255\255\101\000\255\255\255\255\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\255\255\255\255\255\255\255\255\085\000\101\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
    \085\000\091\000\092\000\096\000\091\000\092\000\096\000\097\000\
    \102\000\255\255\097\000\102\000\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\101\000\255\255\255\255\255\255\255\255\
    \255\255\091\000\092\000\255\255\255\255\255\255\255\255\255\255\
    \096\000\255\255\255\255\255\255\097\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\104\000\102\000\255\255\255\255\
    \104\000\104\000\104\000\104\000\255\255\104\000\104\000\104\000\
    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
    \104\000\104\000\255\255\255\255\255\255\255\255\255\255\104\000\
    \255\255\255\255\104\000\255\255\104\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\091\000\092\000\096\000\255\255\255\255\
    \255\255\097\000\102\000\104\000\255\255\104\000\255\255\104\000\
    \255\255\255\255\255\255\104\000\104\000\104\000\104\000\255\255\
    \255\255\255\255\104\000\255\255\104\000\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\104\000\255\255\
    \255\255\255\255\104\000\104\000\104\000\104\000\255\255\104\000\
    \104\000\255\255\255\255\104\000\104\000\104\000\255\255\106\000\
    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
    \106\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \106\000\106\000\106\000\106\000\106\000\106\000\108\000\108\000\
    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\108\000\
    \108\000\108\000\108\000\108\000\108\000\255\255\255\255\101\000\
    \106\000\106\000\106\000\106\000\106\000\106\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\108\000\
    \108\000\108\000\108\000\108\000\108\000\255\255\255\255\255\255\
    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
    \109\000\109\000\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\109\000\109\000\109\000\109\000\109\000\109\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\091\000\
    \092\000\096\000\255\255\255\255\255\255\097\000\102\000\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \104\000\109\000\109\000\109\000\109\000\109\000\109\000\110\000\
    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
    \110\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
    ";
  Lexing.lex_base_code = 
   "";
  Lexing.lex_backtrk_code = 
   "";
  Lexing.lex_default_code = 
   "";
  Lexing.lex_trans_code = 
   "";
  Lexing.lex_check_code = 
   "";
  Lexing.lex_code = 
   "";
}

let rec skip_header lexbuf =
    __ocaml_lex_skip_header_rec lexbuf 0
and __ocaml_lex_skip_header_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 154 "lexer.mll"
                  ( skip_header lexbuf )
# 581 "lexer.ml"

  | 1 ->
# 155 "lexer.mll"
                      ( skip_header lexbuf )
# 586 "lexer.ml"

  | 2 ->
# 156 "lexer.mll"
            ( )
# 591 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_skip_header_rec lexbuf __ocaml_lex_state

and token lexbuf =
    __ocaml_lex_token_rec lexbuf 7
and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 159 "lexer.mll"
       ( mk lexbuf Eof )
# 602 "lexer.ml"

  | 1 ->
# 160 "lexer.mll"
               ( token lexbuf )
# 607 "lexer.ml"

  | 2 ->
# 161 "lexer.mll"
          ( newline lexbuf; token lexbuf )
# 612 "lexer.ml"

  | 3 ->
# 162 "lexer.mll"
               ( newline lexbuf; token lexbuf )
# 617 "lexer.ml"

  | 4 ->
# 163 "lexer.mll"
                                   ( mk lexbuf (Const (Int (lexeme lexbuf))) )
# 622 "lexer.ml"

  | 5 ->
# 164 "lexer.mll"
              ( mk lexbuf (Const (Int (lexeme lexbuf))) )
# 627 "lexer.ml"

  | 6 ->
# 165 "lexer.mll"
                             ( mk lexbuf (Const (Float (lexeme lexbuf))) )
# 632 "lexer.ml"

  | 7 ->
# 166 "lexer.mll"
                  ( mk lexbuf (Const (Float (lexeme lexbuf))) )
# 637 "lexer.ml"

  | 8 ->
# 167 "lexer.mll"
                                              ( mk lexbuf (Const (Float (lexeme lexbuf))) )
# 642 "lexer.ml"

  | 9 ->
# 168 "lexer.mll"
                                                             ( mk lexbuf (Const (Float (lexeme lexbuf))) )
# 647 "lexer.ml"

  | 10 ->
# 169 "lexer.mll"
                    (
			let s = lexeme lexbuf in
			mk lexbuf (IntInterval (String.sub s 0 (String.length s - 3)))
		)
# 655 "lexer.ml"

  | 11 ->
# 173 "lexer.mll"
                       (
			let s = lexeme lexbuf in
			mk lexbuf (CommentLine (String.sub s 2 ((String.length s)-2)))
		)
# 663 "lexer.ml"

  | 12 ->
# 177 "lexer.mll"
        ( mk lexbuf (Unop Increment) )
# 668 "lexer.ml"

  | 13 ->
# 178 "lexer.mll"
        ( mk lexbuf (Unop Decrement) )
# 673 "lexer.ml"

  | 14 ->
# 179 "lexer.mll"
        ( mk lexbuf (Unop NegBits) )
# 678 "lexer.ml"

  | 15 ->
# 180 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpMod)) )
# 683 "lexer.ml"

  | 16 ->
# 181 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpAnd)) )
# 688 "lexer.ml"

  | 17 ->
# 182 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpOr)) )
# 693 "lexer.ml"

  | 18 ->
# 183 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpXor)) )
# 698 "lexer.ml"

  | 19 ->
# 184 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpAdd)) )
# 703 "lexer.ml"

  | 20 ->
# 185 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpSub)) )
# 708 "lexer.ml"

  | 21 ->
# 186 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpMult)) )
# 713 "lexer.ml"

  | 22 ->
# 187 "lexer.mll"
        ( mk lexbuf (Binop (OpAssignOp OpDiv)) )
# 718 "lexer.ml"

  | 23 ->
# 188 "lexer.mll"
         ( mk lexbuf (Binop (OpAssignOp OpShl)) )
# 723 "lexer.ml"

  | 24 ->
# 191 "lexer.mll"
        ( mk lexbuf (Binop OpEq) )
# 728 "lexer.ml"

  | 25 ->
# 192 "lexer.mll"
        ( mk lexbuf (Binop OpNotEq) )
# 733 "lexer.ml"

  | 26 ->
# 193 "lexer.mll"
        ( mk lexbuf (Binop OpLte) )
# 738 "lexer.ml"

  | 27 ->
# 195 "lexer.mll"
        ( mk lexbuf (Binop OpBoolAnd) )
# 743 "lexer.ml"

  | 28 ->
# 196 "lexer.mll"
        ( mk lexbuf (Binop OpBoolOr) )
# 748 "lexer.ml"

  | 29 ->
# 197 "lexer.mll"
        ( mk lexbuf (Binop OpShl) )
# 753 "lexer.ml"

  | 30 ->
# 198 "lexer.mll"
        ( mk lexbuf Arrow )
# 758 "lexer.ml"

  | 31 ->
# 199 "lexer.mll"
         ( mk lexbuf (Binop OpInterval) )
# 763 "lexer.ml"

  | 32 ->
# 200 "lexer.mll"
       ( mk lexbuf (Unop Not) )
# 768 "lexer.ml"

  | 33 ->
# 201 "lexer.mll"
       ( mk lexbuf (Binop OpLt) )
# 773 "lexer.ml"

  | 34 ->
# 202 "lexer.mll"
       ( mk lexbuf (Binop OpGt) )
# 778 "lexer.ml"

  | 35 ->
# 203 "lexer.mll"
       ( mk lexbuf Semicolon )
# 783 "lexer.ml"

  | 36 ->
# 204 "lexer.mll"
       ( mk lexbuf DblDot )
# 788 "lexer.ml"

  | 37 ->
# 205 "lexer.mll"
       ( mk lexbuf Comma )
# 793 "lexer.ml"

  | 38 ->
# 206 "lexer.mll"
       ( mk lexbuf Dot )
# 798 "lexer.ml"

  | 39 ->
# 207 "lexer.mll"
       ( mk lexbuf (Binop OpMod) )
# 803 "lexer.ml"

  | 40 ->
# 208 "lexer.mll"
       ( mk lexbuf (Binop OpAnd) )
# 808 "lexer.ml"

  | 41 ->
# 209 "lexer.mll"
       ( mk lexbuf (Binop OpOr) )
# 813 "lexer.ml"

  | 42 ->
# 210 "lexer.mll"
       ( mk lexbuf (Binop OpXor) )
# 818 "lexer.ml"

  | 43 ->
# 211 "lexer.mll"
       ( mk lexbuf (Binop OpAdd) )
# 823 "lexer.ml"

  | 44 ->
# 212 "lexer.mll"
       ( mk lexbuf (Binop OpMult) )
# 828 "lexer.ml"

  | 45 ->
# 213 "lexer.mll"
       ( mk lexbuf (Binop OpDiv) )
# 833 "lexer.ml"

  | 46 ->
# 214 "lexer.mll"
       ( mk lexbuf (Binop OpSub) )
# 838 "lexer.ml"

  | 47 ->
# 215 "lexer.mll"
       ( mk lexbuf (Binop OpAssign) )
# 843 "lexer.ml"

  | 48 ->
# 216 "lexer.mll"
       ( mk lexbuf BkOpen )
# 848 "lexer.ml"

  | 49 ->
# 217 "lexer.mll"
       ( mk lexbuf BkClose )
# 853 "lexer.ml"

  | 50 ->
# 218 "lexer.mll"
       ( mk lexbuf BrOpen )
# 858 "lexer.ml"

  | 51 ->
# 219 "lexer.mll"
       ( mk lexbuf BrClose )
# 863 "lexer.ml"

  | 52 ->
# 220 "lexer.mll"
       ( mk lexbuf POpen )
# 868 "lexer.ml"

  | 53 ->
# 221 "lexer.mll"
       ( mk lexbuf PClose )
# 873 "lexer.ml"

  | 54 ->
# 222 "lexer.mll"
       ( mk lexbuf Question )
# 878 "lexer.ml"

  | 55 ->
# 223 "lexer.mll"
       ( mk lexbuf At )
# 883 "lexer.ml"

  | 56 ->
# 224 "lexer.mll"
        (
			reset();
			let pmin = lexeme_start lexbuf in
			let pmax = (try comment lexbuf with Exit -> error Unclosed_comment pmin) in
			mk_tok (Comment (contents())) pmin pmax;
		)
# 893 "lexer.ml"

  | 57 ->
# 230 "lexer.mll"
       (
			reset();
			let pmin = lexeme_start lexbuf in
			let pmax = (try string lexbuf with Exit -> error Unterminated_string pmin) in
			let str = (try unescape (contents()) with Exit -> error Invalid_escape pmin) in
			mk_tok (Const (String str)) pmin pmax;
		)
# 904 "lexer.ml"

  | 58 ->
# 237 "lexer.mll"
       (
			reset();
			let pmin = lexeme_start lexbuf in
			let pmax = (try string2 lexbuf with Exit -> error Unterminated_string pmin) in
			let str = (try unescape (contents()) with Exit -> error Invalid_escape pmin) in
			mk_tok (Const (String str)) pmin pmax;
		)
# 915 "lexer.ml"

  | 59 ->
# 244 "lexer.mll"
        (
			reset();
			let pmin = lexeme_start lexbuf in
			let options, pmax = (try regexp lexbuf with Exit -> error Unterminated_regexp pmin) in
			let str = contents() in
			mk_tok (Const (Regexp (str,options))) pmin pmax;
		)
# 926 "lexer.ml"

  | 60 ->
# 251 "lexer.mll"
             (
			let v = lexeme lexbuf in
			let v = String.sub v 1 (String.length v - 1) in
			mk lexbuf (Macro v)
		)
# 935 "lexer.ml"

  | 61 ->
# 256 "lexer.mll"
                                      (
			let v = lexeme lexbuf in
			let v = String.sub v 1 (String.length v - 1) in
			mk lexbuf (Dollar v)
		)
# 944 "lexer.ml"

  | 62 ->
# 261 "lexer.mll"
         ( mk_ident lexbuf )
# 949 "lexer.ml"

  | 63 ->
# 262 "lexer.mll"
          ( mk lexbuf (Const (Ident (lexeme lexbuf))) )
# 954 "lexer.ml"

  | 64 ->
# 263 "lexer.mll"
     ( invalid_char lexbuf )
# 959 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state

and comment lexbuf =
    __ocaml_lex_comment_rec lexbuf 86
and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 266 "lexer.mll"
       ( raise Exit )
# 970 "lexer.ml"

  | 1 ->
# 267 "lexer.mll"
                        ( newline lexbuf; store lexbuf; comment lexbuf )
# 975 "lexer.ml"

  | 2 ->
# 268 "lexer.mll"
        ( lexeme_end lexbuf )
# 980 "lexer.ml"

  | 3 ->
# 269 "lexer.mll"
       ( store lexbuf; comment lexbuf )
# 985 "lexer.ml"

  | 4 ->
# 270 "lexer.mll"
                     ( store lexbuf; comment lexbuf )
# 990 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state

and string lexbuf =
    __ocaml_lex_string_rec lexbuf 91
and __ocaml_lex_string_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 273 "lexer.mll"
       ( raise Exit )
# 1001 "lexer.ml"

  | 1 ->
# 274 "lexer.mll"
                        ( newline lexbuf; store lexbuf; string lexbuf )
# 1006 "lexer.ml"

  | 2 ->
# 275 "lexer.mll"
          ( store lexbuf; string lexbuf )
# 1011 "lexer.ml"

  | 3 ->
# 276 "lexer.mll"
          ( store lexbuf; string lexbuf )
# 1016 "lexer.ml"

  | 4 ->
# 277 "lexer.mll"
        ( store lexbuf; string lexbuf )
# 1021 "lexer.ml"

  | 5 ->
# 278 "lexer.mll"
       ( lexeme_end lexbuf )
# 1026 "lexer.ml"

  | 6 ->
# 279 "lexer.mll"
                          ( store lexbuf; string lexbuf )
# 1031 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_rec lexbuf __ocaml_lex_state

and string2 lexbuf =
    __ocaml_lex_string2_rec lexbuf 96
and __ocaml_lex_string2_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 282 "lexer.mll"
       ( raise Exit )
# 1042 "lexer.ml"

  | 1 ->
# 283 "lexer.mll"
                        ( newline lexbuf; store lexbuf; string2 lexbuf )
# 1047 "lexer.ml"

  | 2 ->
# 284 "lexer.mll"
        ( store lexbuf; string2 lexbuf )
# 1052 "lexer.ml"

  | 3 ->
# 285 "lexer.mll"
          ( store lexbuf; string2 lexbuf )
# 1057 "lexer.ml"

  | 4 ->
# 286 "lexer.mll"
         ( store lexbuf; string2 lexbuf )
# 1062 "lexer.ml"

  | 5 ->
# 287 "lexer.mll"
       ( lexeme_end lexbuf )
# 1067 "lexer.ml"

  | 6 ->
# 288 "lexer.mll"
                           ( store lexbuf; string2 lexbuf )
# 1072 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string2_rec lexbuf __ocaml_lex_state

and regexp lexbuf =
    __ocaml_lex_regexp_rec lexbuf 101
and __ocaml_lex_regexp_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 291 "lexer.mll"
                     ( raise Exit )
# 1083 "lexer.ml"

  | 1 ->
# 292 "lexer.mll"
            ( add "/"; regexp lexbuf )
# 1088 "lexer.ml"

  | 2 ->
# 293 "lexer.mll"
            ( add "\r"; regexp lexbuf )
# 1093 "lexer.ml"

  | 3 ->
# 294 "lexer.mll"
            ( add "\n"; regexp lexbuf )
# 1098 "lexer.ml"

  | 4 ->
# 295 "lexer.mll"
            ( add "\t"; regexp lexbuf )
# 1103 "lexer.ml"

  | 5 ->
# 296 "lexer.mll"
                                                                               ( add (lexeme lexbuf); regexp lexbuf )
# 1108 "lexer.ml"

  | 6 ->
# 297 "lexer.mll"
                                              ( add (lexeme lexbuf); regexp lexbuf )
# 1113 "lexer.ml"

  | 7 ->
# 298 "lexer.mll"
                                                                                                                          ( add (lexeme lexbuf); regexp lexbuf )
# 1118 "lexer.ml"

  | 8 ->
# 299 "lexer.mll"
                 ( error (Invalid_character (lexeme lexbuf).[1]) (lexeme_end lexbuf - 1) )
# 1123 "lexer.ml"

  | 9 ->
# 300 "lexer.mll"
       ( regexp_options lexbuf, lexeme_end lexbuf )
# 1128 "lexer.ml"

  | 10 ->
# 301 "lexer.mll"
                           ( store lexbuf; regexp lexbuf )
# 1133 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_regexp_rec lexbuf __ocaml_lex_state

and regexp_options lexbuf =
    __ocaml_lex_regexp_options_rec lexbuf 112
and __ocaml_lex_regexp_options_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 304 "lexer.mll"
                               (
			let l = lexeme lexbuf in
			l ^ regexp_options lexbuf
		)
# 1147 "lexer.ml"

  | 1 ->
# 308 "lexer.mll"
               ( error Invalid_option (lexeme_start lexbuf) )
# 1152 "lexer.ml"

  | 2 ->
# 309 "lexer.mll"
      ( "" )
# 1157 "lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_regexp_options_rec lexbuf __ocaml_lex_state

;;

